Autor: Yina Sofía Racinez Jaramillo
yracinez@unal.edu.co
Universidad Nacional de Colombia Facultad de Minas Posgrado en Aprovechamiento de Recursos Hidráulicos
Código creado como ejercicio académico para el curso de Análisis Geoespacial
La creciente fragmentación del paisaje debido a la expansión urbana y la transformación de hábitats naturales plantea desafíos significativos para la conservación de la biodiversidad y el mantenimiento de los procesos ecológicos. En particular, la conectividad ecológica ha surgido como un concepto clave en la planificación y gestión de paisajes, ya que desempeña un papel fundamental en la viabilidad a largo plazo de las poblaciones y en la restauración de los ecosistemas degradados. En el contexto del corregimiento de Santa Elena, Antioquia, cuya superficie de bosques se encuentran fuertemente perturbados y con un alto grado de de desconexión entre ellos, en particular por encontrarse embebidos en una matriz de tierras urbanizadas, tierras dedicadas a a diferentes actividades de producción silvícola y agropecuaria, y tierras de reciente suburbanización (Colorado et al., 2017). No obstante, los bosques de este corregimiento cumplen funciones importantes en términos de recreación para la población metropolitana, así como para la regulación hídrica de áreas abastecedoras de acueductos de una población rural significativa (Alcaldía de Medellín, 2014). Es por ello que la evaluación de la conectividad ecológica se convierte en una prioridad para garantizar la conservación de su patrimonio natural y la prestación de bienes y servicios ecosistémicos. El objetivo de este estudio es llevar a cabo una evaluación de la conectividad ecológica en el corregimiento de Santa Elena, utilizando herramientas de ecología del paisaje y análisis espaciales, a partir de las cuales se pueden identificar los corredores de conectividad ecológica, que a su vez permiten evaluar la restricciones al movimiento de las especies y determinar las áreas prioritarias para la restauración y conservación. Con este estudio se pretende proporcionar información para el diseño de estrategias de conservación y restauración que promuevan la conectividad ecológica en el corregimiento de Santa Elena. Los resultados obtenidos ayudarán a orientar la toma de decisiones en la planificación territorial, la gestión de áreas protegidas y la implementación de medidas de manejo del paisaje que contribuyan a mantener los procesos ecológicos y preservar la biodiversidad en la región.
Se realizó la configuración del ambiente de trabajo para análisis geoespacial mediante la instalación del Paquete Geospatial de python, desarrollado por Qiusheng Wu, e instalado siguiendo los pasos dados por el autor en el siguiente video, clic aquí.
También se instaló la librería PyLandStats para estimar métricas de paisaje y finalmente se importaron las librerías necesarias para el desarrollo del ejercicio académico
# importar las librerias para el desarrollo del estudio
import os # libreria para manejo de rutas de archivos
os.environ['USE_PYGEOS'] = '0' # para evitar advertencia pygeos deprecate y usar shapely por defecto
import geopandas as gpd # libreria para manejo de datos vectoriales
import pandas as pd
import fiona # libreria para manejo del .gpkg
import matplotlib.pyplot as plt # libreria para graficas
import seaborn as sns # libreria para graficas
import rasterio # libreria para manejo de datos raster
import pylandstats as pls
# definir estilo para graficas
plt.style.use('seaborn')
Module c:\Users\Sofi\miniconda3\envs\geospatial\lib\site-packages\pylandstats\landscape.py has not been compiled for Transonic-Numba
# nombre del geopackage con datos de entrada
nombre_gpkg_entrada = 'insumos_base.gpkg'
# ruta base para unir luego con gpkg, img y raster
ruta_base = os.getcwd()
# ruta a geopackage de datos de entrada
gpkg_entrada = os.path.join(ruta_base,nombre_gpkg_entrada)
# Se listan las capas del gpkg
capas = fiona.listlayers(gpkg_entrada)
capas
['cob_amva_25k', 'vias_pg', 'limites_corregimiento', 'sectores_santa_elena', 'drenajes_ln']
# Cargar capas del gpkg
gdf_cob = gpd.read_file(gpkg_entrada, layer='cob_amva_25k') # Lee la capa de coberturas
gdf_vias = gpd.read_file(gpkg_entrada, layer='vias_pg') # Lee la capa de vias
gdf_sectores = gpd.read_file(gpkg_entrada, layer='sectores_santa_elena') # Lee la capa de sectores de Santa Elena
gdf_drenajes = gpd.read_file(gpkg_entrada, layer='drenajes_ln') # Lee la capa de drenajes
gdf_limite = gpd.read_file(gpkg_entrada, layer='limites_corregimiento') # Lee la capa de limites del corregimiento
# obtener nombre de columnas de la capa sectores
gdf_sectores.columns
Index(['CODIGO', 'NOMBRE', 'Area_km2', 'geometry'], dtype='object')
Santa Elena es uno de los cinco (5) corregimientos que tiene el territorio rural de Medellín. Abarca un total de 74,15 km2. Se localiza en el oriente de la ciudad, Santa Elena sirve de límite natural entre los Valles de Aburrá, que tiene al río Medellín como eje estructurante del paisaje, y San Nicolás, por donde discurre el río Negro hacia el Valle del Magdalena, principal río del país. El corregimiento está divido político-administrativamente en 11 veredas, su población aproximada es de 18.000 personas, y las principales actividades económicas desarrolladas son agropecuarias, silvícolas, y de servicios asociados a la suburbanización y el turismo (Grupo HTM-Municipio de Medellín, 2009). El territorio se encuentra distribuido en once sectores correspondientes a: Barro Blanco, El Cerro, El Llano, El Plan, El Placer, Las Palmas, Mazo, Media Luna, Piedra Gorda, Piedras Blancas-Matasano y Santa Elena sector central. El sector Piedras Blancas-Matasano ocupa el 30% del área total del corregimiento, seguido de Las Palmas con un 21,44%, Media Luna con el 12,73%, El Pan con 8,33% y Mazo con 6,76%, el resto de sectores abarcan menos del 5% del total del área, tal y como se muestra a continuación:
# se agrega columna con proporcion de area por sector y se muestra en tabla
gdf_sectores["prop_area"] = round((gdf_sectores.Area_km2/gdf_sectores.Area_km2.sum())*100,2)
gdf_sectores[['NOMBRE', 'prop_area']].sort_values('prop_area', ascending=False)
| NOMBRE | prop_area | |
|---|---|---|
| 8 | Piedras Blancas - Matasano | 30.00 |
| 2 | Las Palmas | 21.44 |
| 0 | Media Luna | 12.73 |
| 4 | El Pan | 8.33 |
| 7 | Mazo | 6.76 |
| 9 | Santa Elena Sector Central | 4.36 |
| 6 | Barro Blanco | 4.21 |
| 1 | Piedra Gorda | 4.07 |
| 3 | El Llano SE | 2.86 |
| 10 | El Placer | 2.76 |
| 5 | El Cerro | 2.48 |
#grafica de pie por sector
fig, ax = plt.subplots(figsize=(7,7))
# se grafica en ax
ax.pie(gdf_sectores.prop_area,
labels=list(gdf_sectores.NOMBRE),
autopct='%1.2f%%')
ax.set_title('Proporción de sectores en área de estudio') # se agrega titulo a grafica
# muestra el pie
fig.show()
C:\Users\Sofi\AppData\Local\Temp\ipykernel_16060\1262794506.py:12: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure. fig.show()
# para mostrar el area de estudio
gdf_sectores.explore(
column="prop_area", # coropleta basada en columna "prop_area"
tooltip=['NOMBRE', 'prop_area'], # muestra "NOMBRE" y proporcion de area en cajetín, cuando se pasa el cursor
popup=True, # mostrar todos los valores de columna con un clic sobre el polígono
tiles="CartoDB positron", # usa "CartoDB positron" de mapa base
cmap="Blues", # usa "Accent" matplotlib para colores
style_kwds=dict(color="black") # usa borde de polígonos negro
)
Con base en la clasificación de coberturas de la tierra por la metodología de de Corine Land Cover Colombia (CLC), Santa Elena se caracteriza por tener el 30,41% de su territorio con plantaciones forestales, seguido de la vegetación secundaria o en transición que ocupa el 18,56%, las instalaciones recreativas con el 13,05% y los pastos limpios con el 11,96% del total del área del corregimiento. A continuación, en la figura se presenta la distribución espacial de las coberturas de la tierra para el corregimiento de Santa Elena.
#obtener nombres de columnas de la capa de coberturas
gdf_cob.columns
Index(['nivel_3', 'Area_ha', 'area_km2', 'cob_equivalente', 'geometry'], dtype='object')
# Para mostrar las coberturas de la tierra
gdf_cob.explore(
column="nivel_3", # coropleta basa en columna del nombre de la cobertura
tooltip=['nivel_3','Area_ha'] , # muestra las coberturas y el area (ha) en el cajetin, cuando se pasa el cursor
popup=True, # muestra todos los valores de la columna con un clic sobre el polígono
tiles="CartoDB positron", # usa cartodb positron de mapa base
cmap="Pastel2", # usa Accent de matplotlib para colores
style_kwds=dict(color="black") # usa borde de polígono negro
)
Por otro lado, en la siguiente tabla se muestra el área en hectáreas y en porcentaje de cada una de las categorías de coberturas presentes en el corregimiento.
# generar dataframe con valores de area: minimo, maximo y suma y cantidad de poligonos por cobertura
cob_res_area = gdf_cob.groupby('nivel_3').agg(num_poli=('nivel_3','count'), # numero de poligonos por cobertura
area_ha_min=('Area_ha','min'), # area de poligono mas pequeno por cobertura
area_ha_max=('Area_ha','max'), # area de poligono mas grande por cobertura
area_ha_tot=('Area_ha','sum')) # area total por cobertura
cob_res_area['area_porcent'] = round(cob_res_area.area_ha_tot/cob_res_area.area_ha_tot.sum()*100,2) # porcentaje de area por cobertura
# muestra tabla generada con anterioridad
cob_res_area
| num_poli | area_ha_min | area_ha_max | area_ha_tot | area_porcent | |
|---|---|---|---|---|---|
| nivel_3 | |||||
| 1.1.1. Tejido urbano continuo | 50 | 1.067845e-06 | 115.665406 | 355.497315 | 4.79 |
| 1.1.2. Tejido urbano discontinuo | 13 | 1.991250e-03 | 86.908197 | 277.962015 | 3.75 |
| 1.2.1. Zonas industriales o comerciales | 1 | 6.486727e+00 | 6.486727 | 6.486727 | 0.09 |
| 1.3.1. Zonas de extracción minera | 1 | 1.883378e+01 | 18.833785 | 18.833785 | 0.25 |
| 1.4.1. Zonas verdes urbanas | 4 | 5.158884e-04 | 0.699386 | 1.384224 | 0.02 |
| 1.4.2. Instalaciones recreativas | 15 | 2.871610e-03 | 363.876179 | 967.973334 | 13.05 |
| 2.3.1. Pastos limpios | 19 | 1.136303e-02 | 258.805521 | 886.929691 | 11.96 |
| 2.3.3. Pastos enmalezados | 7 | 2.227007e-02 | 63.770656 | 290.281644 | 3.91 |
| 2.4.2. Mosaico de pastos y cultivos | 8 | 6.230543e-07 | 47.595071 | 54.315728 | 0.73 |
| 2.4.3. Mosaico de cultivos, pastos y espacios naturales | 3 | 3.196269e+01 | 89.382673 | 155.844165 | 2.10 |
| 2.4.4. Mosaico de pastos con espacios naturales | 8 | 1.459699e+01 | 95.600221 | 459.071261 | 6.19 |
| 3.1.3. Bosque fragmentado | 2 | 1.071827e+02 | 125.464992 | 232.647733 | 3.14 |
| 3.1.4. Bosque de galería y ripario | 2 | 4.069643e-02 | 48.787450 | 48.828146 | 0.66 |
| 3.1.5. Plantación forestal | 24 | 5.184306e-03 | 1126.118101 | 2255.113382 | 30.41 |
| 3.2.3. Vegetación secundaria o en transición | 36 | 1.183699e-03 | 266.205561 | 1376.400409 | 18.56 |
| 3.3.3. Tierras desnudas y degradadas | 1 | 2.767133e+01 | 27.671330 | 27.671330 | 0.37 |
Para realizar una descripción general de áreas naturales a partir de las cuales se configuran áreas núcleo, se categorizaron las coberturas en naturales y antropizadas; siendo el Bosque de galería, Bosque fragmentado y la Vegetación secundaria o en transición las que corresponden con coberturas naturales, las demás se tomaron como antropizadas.
# Condicion para llenar columna nueva con categoria Natural
condicion = gdf_cob['nivel_3'].isin(['3.1.4. Bosque de galería y ripario', '3.1.3. Bosque fragmentado', '3.2.3. Vegetación secundaria o en transición'])
# Se crea campo categ_cob con palabra vacio
gdf_cob['categ_cob'] = 'vacio'
# Se reemplaza vacio por Natural o Antropica segun la condicion
gdf_cob['categ_cob'] = gdf_cob['categ_cob'].mask(condicion, 'Natural').mask(~condicion, 'Antropica')
# Muestra los datos de cinco registros al azar
gdf_cob.sample(5)
| nivel_3 | Area_ha | area_km2 | cob_equivalente | geometry | categ_cob | |
|---|---|---|---|---|---|---|
| 50 | 3.2.3. Vegetación secundaria o en transición | 97.253372 | 0.972534 | Rastrojo alto | MULTIPOLYGON (((4723707.632 2253461.982, 47237... | Natural |
| 0 | 1.1.1. Tejido urbano continuo | 5.872635 | 0.058726 | Construcciones | MULTIPOLYGON (((4723749.181 2244721.402, 47237... | Antropica |
| 10 | 1.4.2. Instalaciones recreativas | 176.817912 | 1.768179 | Construcciones | MULTIPOLYGON (((4723318.371 2250216.446, 47233... | Antropica |
| 94 | 2.3.1. Pastos limpios | 0.011363 | 0.000114 | Pasto manejado | MULTIPOLYGON (((4719873.435 2241102.831, 47198... | Antropica |
| 76 | 3.1.5. Plantación forestal | 28.309638 | 0.283096 | Bosque plantado | MULTIPOLYGON (((4719459.685 2253123.325, 47194... | Antropica |
# resumen de area de poligonos
round(gdf_cob.Area_ha.describe(),2)
count 194.00 mean 38.22 std 96.29 min 0.00 25% 0.10 50% 4.90 75% 43.76 max 1126.12 Name: Area_ha, dtype: float64
A nivel general los polígonos de coberturas presentan áreas menores 100 hectáreas, con un valor promedio de 38,22 hectáreas, el 50% de los datos se encuentra entre 0.10 y 43.76 hectáreas y existe un polígono con un área de 1126,12 hectáreas. Aunque el área natural es poca, también se puede observar que la mayoría de polígonos tienen áreas menores a 100 hectáreas y siguen distribuciones similares a las del conjunto de datos general, lo que indica que la zona está altamente intervenida, bien sea por uso comercial como cultivos y plantaciones o por uso para vivienda.
# graficar histograma por area de poligonos juntos y por cobertura
fig,(ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10, 7))
ax1.hist(
gdf_cob.Area_ha,
bins='sturges' # numero de agrupaciones se puede poner un numero o un metodo: 'auto', 'fd', 'doane', 'scott', 'stone', 'rice', 'sturges', or 'sqrt'
)
# agregar linea punteada con valor medio de area de poligonos
ax1.axvline(
x=gdf_cob.Area_ha.mean(),
color = 'red', #color de linea
linestyle='dashed', #estilo de linea
linewidth= 2, # ancho de linea
label='media: {:5.2f}'.format(gdf_cob.Area_ha.mean()) # label para linea punteada
)
ax1.set_xlabel('Área (ha)') # nombre eje x
ax1.set_ylabel('Frecuencia') # nombre eje y
ax1.set_title('Histograma de frecuencias')
ax1.legend(loc=0)
# graficar histograma por area de poligonos y categoria natural o antropica
ax2.hist(
[gdf_cob[gdf_cob['categ_cob']=='Antropica'].Area_ha, gdf_cob[gdf_cob['categ_cob']=='Natural'].Area_ha], # datos para histograma, van entre corchetes para graficar dos variables
bins='sturges', # numero de agrupaciones se puede poner un numero o un metodo: 'auto', 'fd', 'doane', 'scott', 'stone', 'rice', 'sturges', or 'sqrt'
label=['Antropico', 'Natural'] # label para barras de histograma, van en el mismo orden de las variables a graficar
)
# agregar linea con valor medio de area de poligonos natural
ax2.axvline(
x=gdf_cob[gdf_cob['categ_cob']=='Natural'].Area_ha.mean(), # valor de linea punteada
color = 'green', # color de linea
linestyle='dashed', # estilo de linea
linewidth= 1, # ancho de linea
label='media naturales: {:5.2f}'.format(gdf_cob[gdf_cob['categ_cob']=='Natural'].Area_ha.mean()) # label para leyenda
)
# agregar linea con valor medio de area de poligonos con actividad antropica
ax2.axvline(
x=gdf_cob[gdf_cob['categ_cob']=='Antropica'].Area_ha.mean(), # valor de linea punteada
color = 'blue', # color de linea
linestyle='dashed', # estilo de linea
linewidth= 1, # ancho de linea
label='media antropicos: {:5.2f}'.format(gdf_cob[gdf_cob['categ_cob']=='Antropica'].Area_ha.mean()) # label para leyenda
)
ax2.set_xlabel('Área (ha)') # nombre del eje x
ax2.set_ylabel('Frecuencia') # nombre del eje y
ax2.set_title('Histograma por categoria Antropica y Natural')
ax2.legend() # activa la leyenda para que se muestre en la grafica
fig.tight_layout() # ajusta las graficas para que no se sobrepongan la de la izquida con la de la derecha
fig.show()
C:\Users\Sofi\AppData\Local\Temp\ipykernel_16060\3412921827.py:56: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure. fig.show()
Para validar si el área natural se distribuye de forma uniforme en todos los sectores del corregimiento, se estimó el área natural por corregimiento y se normalizó con el área del mismo.
# Hacer interseccion entre coberturas y sectores
gdf_cob_sect1 = gdf_cob.overlay(gdf_sectores, how='intersection')
# hacer copia de gdf interseccion
gdf_cob_sect2 = gdf_cob_sect1.copy()
# separar poligonos
gdf_cob_sect2 = gdf_cob_sect2.explode(ignore_index=True)
# eliminar columnas area_km2 y Area_km2
gdf_cob_sect2 = gdf_cob_sect2.drop(columns=['area_km2', 'Area_km2'])
# actualizar area en hectareas
gdf_cob_sect2['Area_ha']=gdf_cob_sect2.area/10000
# mostrar los primeros cinco registros
gdf_cob_sect2.head()
| nivel_3 | Area_ha | cob_equivalente | categ_cob | CODIGO | NOMBRE | prop_area | geometry | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1.1.1. Tejido urbano continuo | 0.000003 | Construcciones | Antropica | 90 | El Llano SE | 2.86 | POLYGON ((4723727.308 2244717.410, 4723727.011... |
| 1 | 1.1.2. Tejido urbano discontinuo | 0.010675 | Construcciones | Antropica | 90 | El Llano SE | 2.86 | POLYGON ((4724037.665 2243939.152, 4724027.420... |
| 2 | 2.3.1. Pastos limpios | 36.928303 | Pasto manejado | Antropica | 90 | El Llano SE | 2.86 | POLYGON ((4723830.627 2243151.455, 4723797.566... |
| 3 | 2.3.1. Pastos limpios | 0.002773 | Pasto manejado | Antropica | 90 | El Llano SE | 2.86 | POLYGON ((4724209.415 2243334.665, 4724216.331... |
| 4 | 2.3.1. Pastos limpios | 0.016777 | Pasto manejado | Antropica | 90 | El Llano SE | 2.86 | POLYGON ((4724042.813 2243341.236, 4724062.672... |
# Estimar el area por sector y categoria Antropica o Natural
df = gdf_cob_sect2.pivot_table(
index='NOMBRE',
columns='categ_cob',
values='Area_ha',
aggfunc='sum'
)
# Renombrar columnas
df=df.rename(index=str, columns={"Antropica":"Antropica_ha",
"Natural":"Natural_ha"})
# Obtener proporcion de area por categoria Antropica o Natural
df_2= round(df.div(df.sum(1,numeric_only=True),axis=0)*100, 2)
# Renombrar columnas
df_2=df_2.rename(index=str, columns={"Antropica_ha":"Antropica_prop",
"Natural_ha":"Natural_prop"})
# Unir areas y proporciones
df_3 = pd.concat([df,df_2],axis=1)
# Convertir indices en columnas
df_3 = df_3.reset_index()
# Hacer copia del gdf sectores
gdf_sectores_2 = gdf_sectores.copy()
# Unir atributos del df3 que tiene areas con gdf sectores 2
gdf_sectores_2 = gdf_sectores_2.merge(df_3, on='NOMBRE')
# Para mostrar la tabla de mayor a menor proporcion de area con cobertura natural
gdf_sectores_2.sort_values('Natural_prop', ascending=False)
| CODIGO | NOMBRE | Area_km2 | geometry | prop_area | Antropica_ha | Natural_ha | Antropica_prop | Natural_prop | |
|---|---|---|---|---|---|---|---|---|---|
| 4 | 90 | El Pan | 6.177280 | MULTIPOLYGON (((4722479.719 2242971.538, 47224... | 8.33 | 389.427729 | 228.300225 | 63.04 | 36.96 |
| 1 | 90 | Piedra Gorda | 3.015669 | MULTIPOLYGON (((4724402.163 2246891.858, 47243... | 4.07 | 211.420296 | 90.146639 | 70.11 | 29.89 |
| 10 | 90 | El Placer | 2.043471 | MULTIPOLYGON (((4724476.337 2245612.042, 47244... | 2.76 | 146.529902 | 57.817215 | 71.71 | 28.29 |
| 7 | 90 | Mazo | 5.011353 | MULTIPOLYGON (((4724668.157 2249538.570, 47247... | 6.76 | 363.221696 | 137.913648 | 72.48 | 27.52 |
| 8 | 90 | Piedras Blancas - Matasano | 22.246690 | MULTIPOLYGON (((4725002.779 2249681.098, 47250... | 30.00 | 1646.255420 | 578.413610 | 74.00 | 26.00 |
| 2 | 90 | Las Palmas | 15.901717 | MULTIPOLYGON (((4720296.019 2242382.963, 47202... | 21.44 | 1215.132549 | 375.039200 | 76.42 | 23.58 |
| 0 | 90 | Media Luna | 9.442278 | MULTIPOLYGON (((4721914.421 2249402.701, 47219... | 12.73 | 814.059201 | 130.168583 | 86.21 | 13.79 |
| 5 | 90 | El Cerro | 1.840583 | MULTIPOLYGON (((4725035.128 2244293.242, 47250... | 2.48 | 165.398720 | 18.659622 | 89.86 | 10.14 |
| 3 | 90 | El Llano SE | 2.119133 | MULTIPOLYGON (((4722479.719 2242971.538, 47225... | 2.86 | 192.902305 | 19.011031 | 91.03 | 8.97 |
| 9 | 90 | Santa Elena Sector Central | 3.230458 | MULTIPOLYGON (((4723199.042 2245378.807, 47232... | 4.36 | 304.736145 | 18.309687 | 94.33 | 5.67 |
| 6 | 90 | Barro Blanco | 3.123775 | MULTIPOLYGON (((4725225.297 2249434.118, 47252... | 4.21 | 308.280637 | 4.096828 | 98.69 | 1.31 |
#Se muestra el mapa de coropletas
gdf_sectores_2.explore(
column="Natural_prop", # coropleta basa en columna del proporcion de area natural
tooltip=['NOMBRE','Natural_prop'], # muestra las proporciones de coberturas con el nombre del sector en el cajetin, cuando se pase el cursor
popup=True, # muestra todos los valores de la columna con un clic sobre el polígono
tiles="CartoDB positron", # usa cartodb positron de mapa base
cmap="Greens", # usa Accent de matplotlib para colores
style_kwds=dict(color="black") # usa borde de polígono negro
)
Con base en los resultados, el sector El Pan, localizado en el sur del corregimiento de Santa Elena, presenta el mayor porcentaje de área natural respecto a los demás, ya que las coberturas naturales cubren cerca del 37% del total del área.
Con el propósito de evaluar la conectividad ecológica en el corregimiento de Santa Elena, se realizaron los siguientes pasos:
Las métricas del paisaje cuantifican el patrón del paisaje únicamente dentro del límite establecido. En este trabajo se calcularon cinco métricas de paisaje, correspondientes a:
Según Colorado et al., (2017) la definición y selección de núcleos para la conservación es parte fundamental del diseño de redes de conectividad, ya que en estos núcleos es donde se considera qye están presentes la mayoría de las comunidades, especies y demás recursos naturales de interés para la conservación. Por otro lado, Kattan (2002) señala que el área, borde y grado de aislamiento son los principales causantes de la extinción de especies en fragmentos de bosque, debido a esto, los criterios para la selección de los núcleos de conservación a conectar se basaron en las métricas definidas anteriormente, considerando que estas se relacionan estrechamente con la funcionalidad ecosistémica. Para esto se identificaron inicialmente los fragmentos de bosques fragmentados, bosque de galería y/o ripario y la vegetación secundaria o en transición, además se tuvo en cuenta que, el área total de los fragmentos fuera mayor a 5,0 ha. Posteriormente se eligieron aquellos núcleos que tuvieran un área interior mayor a 1,0 ha. Así como lo mencionan Colorado at al., (2017) áreas de interior como la sugerida, permiten tener una mayor funcionalidad ecosistémica oara poblaciones de fauna y flora con requerimientos de interior de bosque, así como el sostenimiento a largo plazo de procesos biológicos relevantes. Finalmente, se seleccionaron aquellos núcleos cuyo MSI mostraran formas redondeadas o casi redondeadasm con algunos brazos de vegetación que facilitaran la conectividad con otros núcleos (Colorado et al.,2017).
En este paso se construyeron dos mapas de fricción, los cuales se relacionan con las limitaciones que la matriz del paisaje presenta para el desplazamiento de los individuos (Colorado et al.,2017). Para ello se realizó una modificación en las variables propuestas por Colorado et al.,(2017), en el cual se evaluaron cuatro (4) criterios correspondientes a coberturas, distancia a vías, distancia a drenajes y áreas núcleo, tal y como se muestra a continuación:

Como insumos de salida se tienen dos mapas de fricción, el primero de ellos corresponde con la suma simple de las variables evaluadas. Por su parte, el segundo mapa de fricción se realizó mediante un Proceso de Análisis Jerárquico (AHP-Analitycal hierarchy process) para la toma de decisiones, desarrollado por Thomas L. Saaty (1980).
En este proceso se consultó a tres (3) profesionales: 1 biólogo flora, 1 ecólogo y 1 docente de ecología del paisaje.
La ponderación de las variables se realizó con base en el análisis multicriterio (variable), teniendo en cuenta una matriz de doble entrada. Los profesionales realizaron la calificación con base en el aporte de los criterios a la restricción o fricción del movimiento de las especies en el corregimiento de Santa Elena, Antioquia; entendiendo que:
A modo de ejemplo, se presenta la siguiente tabla:

Por otro lado, la escala numérica, su importancia y explicación se resenta a continuación:

Para generar la red de conectividad entre los núcleos de conservación definidos previamente, se utilizó el método de la ruta de menor costo para el desplazamiento. Para ello se utiliza un modelo costo-distancia, empleando funciones de Python con las cuales se identifican las rutas de conectividad entre los centroides de los fragmentos (núcleos) sobre cada uno de los mapas de fricción definidos. Uitlizando cada núcleo como punto de origen a conectar sobre la superficie de costos creadam se generan redes de conectividad desde los núcleos origen hacia los núcleos destinos por las rutas con menor dificultad para el desplazamiento. Lo anterior implica que la ruta diseñada corresponda con aquella que posee el menor valor acumulado de desplazamiento sobre la superficie de costos. Una vez obtenidas las rutas de conectividad, se cruzaron con la capa de coberturas de la tierra, previamente reclasificadas, para luego ser comparadas con los resultados obtenidos por Colorado et al., (2017).
A continuación se presentan las métricas de paisaje estructural definidas.
# Convertir las coberturas a raster
from rasterio.features import rasterize
cob_raster=gdf_cob
Se definieron XXX fragmentos de bosques o vegetación secundaria como núcleos de conservación a conectar, las áreas de estos núcleos oscilaron entre XX y XXX ha, con un promedio de XXX +- XXX ha. Por otro lado, siguiendo los criterios de priorización se obtuvieron XXX núcleos para conservación en el corregimiento de Santa Elena, los cuales se presentan en la siguiente figura.
# Mostrar los nucleos de conservacion a conectar
Estos XXX núcleos presentaron, en conjunto, un total de XXXXX ha, de las cuales XXXXX ha corresponden con áreas de interior y oscilaron en tamaños desde XXXX hasta XXXX ha, con un promedio de XXX +- XXX ha. Finalmente el índice de forma fluctuó entre XXXX y XXXX con un promedio de XXXX +- XXXX ha.
El mapa de fricción correspondiente a la suma simple de las variables evaluadas se muestra a continuación.
### Mostrar el mapa de friccion con suma simple
Con base en lo anterior se evidencia que, las coberturas que imponen mayor restricción al desplazamiento de las especies corresponden con los territorios artificializados y a aquellas zonas que se encuentran cercanas a las vías.
La matriz resultante y los valores de ponderación de cada una de las variables, se muestra a continuación

En este caso, se le otorgó mayor peso a las áreas núcleos (50%), seguido de las coberturas (27%), la distancia a la red hídrica (17%) y finalmente la distancia a las vías (5%)
Con base en lo anterior, se calcula entonces la nueva superficie de fricción como sigue:
# Mostrar el mapa de superficie de friccion con suma ponderada
Teniendo en cuenta lo anterior se tiene que las coberturas boscosas y de mayor estado sucesional evidencian una menor restricción a la movilidad de las especies, lo contrario ocurre con las áreas artificializadas como los tejidos urbanos, vías, instalaciones recreativas, entre otras.
Ahora bien, haciendo un cruce entre el mapa de fricción y los sectores del corregimiento de Santa Elena se tiene que, el sector conocido como XXXXX presenta mayor área de fricción con los dos mapas de fricción determinados, esto indica el alto grado de intervención. Por otro lado, el sector con menor restricción al movimiento de las especies fue XXXX.
La red de conectividad ecológica obtenida para el corregimiento de Santa Elena se presenta a continuación:
# Mostrar los corredores obtenidos